package 操作系统实验.实验二.生产者与消费者;/**
 * ************************************************************************
 * 项目名称: projectweb <br>
 * 文件名称:  <br>
 * 文件描述: 这里添加您的类文件描述，说明当前文件要包含的功能。 <br>
 * 文件创建：1913040634刘世锦  <br>
 * 创建时间: 2021/4/1 <br>
 *
 * @version v1.0 <br>
 * @update [序号][日期YYYY-MM-DD][更改人姓名][变更描述]<br>
 * ************************************************************************
 */

/**
 * @ProjectName: projectweb
 * @ClassName: product
 * @Description: 请描述该类的功能
 * @Author: 1913040634刘世锦
 * @Date: 2021/4/1 17:49 .
 * @version v1.0
 */
/**
 * 模拟实现生产者--消费者问题
 *
 * @date 2014/06/24
 *
 */
public class ProductiveConsumption {
    private int front=0;             //队头
    private int next=0;              //队尾
    private int bufferLength;        //缓冲区大小
    private String buffer[];         //缓冲区
    private int emptyNum;          //空缓冲区数目
    public ProductiveConsumption(int bufferLength){
        this.bufferLength=bufferLength;
        buffer=new String[bufferLength];
        emptyNum=bufferLength;
    }
    //生产
    public synchronized void produce(String data){
        System.out.println("生产前,空缓冲区数目-----------"+emptyNum);
        System.out.println("***生产者正在生产"+data);
        while(full()){
            System.out.println("*****缓冲池已满，生产等待");
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.notify();
        buffer[next]=data;
        next=(next+1)%bufferLength;
        System.out.println("****生产者成功生产："+data);
        emptyNum--;
        System.out.println("生产后,空缓冲区数目-----------"+emptyNum);
    }
    //消费
    public synchronized void consum(){
        System.out.println("消费前,空缓冲区数目-----------"+emptyNum);
        while(empty()){
            System.out.println("*****缓冲池为空，消费等待");
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("***消费者正在消费"+buffer[front]);
        this.notify();
        System.out.println("****消费者成功消费："+buffer[front]);
        front=(front+1)%bufferLength;
        emptyNum++;
        System.out.println("消费后,空缓冲区数目-----------"+emptyNum);
    }
    //缓冲池是否已满
    public boolean full(){
        if(emptyNum==0){
            return true;
        }
        return false;
    }
    //缓冲池是否为空
    public boolean empty(){
        if(bufferLength==emptyNum){
            return true;
        }
        return false;
    }

}